SPB Git

spb/earth-now Public License

earth-now.co — real-time planetary dashboard: live world metrics modeled, not streamed.

TypeScript 93% Shell 2.3% SQL 1.4% JavaScript 1.3% Dockerfile 1.2% CSS 0.8%
1.9 KB · 59 lines tsx
Raw Blame History
1/**2 * earth-now.co3 * Author:  Simon-Pierre Boucher4 * Contact: contact@spboucher.ai5 * File:    apps/web/app/embed/[id]/page.tsx6 * Purpose: Minimal standalone embed page — one fullscreen LiveCounter for iframes (?window=&lang=), no chrome, earth-now.co attribution7 */89import EmbedCounter from "@/components/EmbedCounter";10import { fetchMetrics, fetchModels } from "@/lib/api";11import { resolveModel, resolvePrimaryWindow } from "@/lib/derived";12import { DEFAULT_LOCALE, isLocale } from "@/lib/messages";13import type { CounterWindow } from "@earth-now/counter";1415export const dynamic = "force-dynamic";1617function isWindow(value: unknown): value is CounterWindow {18  return value === "today" || value === "ytd" || value === "session" || value === "total";19}2021export default async function EmbedPage({22  params,23  searchParams,24}: {25  params: { id: string };26  searchParams?: { window?: string; lang?: string };27}) {28  const langParam = searchParams?.lang;29  const locale = isLocale(langParam) ? langParam : DEFAULT_LOCALE;3031  try {32    const [metrics, modelsResponse] = await Promise.all([fetchMetrics(), fetchModels()]);33    const metric = metrics.find((m) => m.id === params.id);34    if (metric === undefined) {35      return (36        <div className="fixed inset-0 z-50 flex items-center justify-center bg-page text-sm text-ink2">37          {locale === "fr" ? "Métrique introuvable" : "Metric not found"} — earth-now.co38        </div>39      );40    }41    const windowParam = searchParams?.window;42    const counterWindow = isWindow(windowParam) ? windowParam : resolvePrimaryWindow(metric);43    return (44      <EmbedCounter45        metric={metric}46        model={resolveModel(metric, modelsResponse.models)}47        window={counterWindow}48        locale={locale}49      />50    );51  } catch {52    return (53      <div className="fixed inset-0 z-50 flex items-center justify-center bg-page text-sm text-ink2">54        API offline — earth-now.co55      </div>56    );57  }58}59